package com.kantboot.system.user.service.impl;

import com.kantboot.system.user.dao.repository.entity.SysUserOnlineRepository;
import com.kantboot.system.user.dao.repository.entity.SysUserOnlineShowRepository;
import com.kantboot.system.user.domain.entity.SysUserOnline;
import com.kantboot.system.user.domain.entity.SysUserOnlineShow;
import com.kantboot.system.user.service.ISysUserOnlineService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService {

    @Resource
    private SysUserOnlineRepository repository;

    @Resource
    private SysUserOnlineShowRepository showRepository;

    @Override
    public void online(Long userId) {
        // 根据用户id查询用户在线信息
        SysUserOnline byUserId = repository.findByUserId(userId);
        if (byUserId == null) {
            // 如果用户在线信息不存在，则创建
            byUserId = new SysUserOnline();
            // 默认用户不隐身
            byUserId.setIsInvisible(false);
            // 设置用户最后一次心跳时间
            byUserId.setGmtLastHeartbeat(new Date());
        }
        // 设置用户id
        byUserId.setUserId(userId);
        // 设置用户在线
        byUserId.setIsOnline(true);
        // 设置最后一次在线时间
        byUserId.setGmtLastOnline(new Date());
        // 保存用户在线信息
        repository.save(byUserId);

        // 根据用户id查询用户在线信息
        SysUserOnlineShow show = showRepository.findByUserId(userId);
        if (show == null) {
            // 如果用户在线信息不存在，则创建
            show = new SysUserOnlineShow();
            show.setIsOnline(true);
            // 设置用户最后一次在线时间
            show.setGmtLastOnline(new Date());
            // 设置用户最后一次心跳时间
            show.setGmtLastHeartbeat(new Date());
            // 设置用户id
            show.setUserId(userId);
        }
        if (!byUserId.getIsInvisible()&&!show.getIsOnline()) {
            // 如果用户没有隐身，并且用户不在线，则设置用户在线
            show.setIsOnline(true);
            // 设置用户最后一次在线时间
            show.setGmtLastOnline(new Date());
        }else if (byUserId.getIsInvisible()&&show.getIsOnline()) {
            // 如果用户隐身，并且用户在线，则设置用户不在线
            show.setIsOnline(false);
        }

        // 设置最后一次在线时间
        showRepository.save(show);
    }

    @Override
    public void offline(Long userId) {
        SysUserOnline sysUserOnline = repository.findByUserId(userId)
                .setIsOnline(false)
                .setGmtLastOnline(new Date());
        repository.save(sysUserOnline);

        SysUserOnlineShow show = showRepository.findByUserId(userId);
        if(show.getIsOnline()){
            show.setIsOnline(false);
            show.setGmtLastOffline(new Date());
            showRepository.save(show);
        }

    }

    @Override
    public void heartbeat(Long userId) {
        // 根据用户id查询用户在线信息，并设置最后一次心跳时间
        SysUserOnline sysUserOnline = repository.findByUserId(userId).setGmtLastHeartbeat(new Date());
        repository.save(sysUserOnline);
        // 根据用户id查询用户在线信息，并设置最后一次心跳时间
        SysUserOnlineShow show = showRepository.findByUserId(userId);
        if(show.getIsOnline()){
            // 如果用户在线，则设置最后一次心跳时间
            show.setGmtLastHeartbeat(new Date());
            showRepository.save(show);
        }
    }

}
